The maze of Python dependency management
direct dependenciesを管理する方法として requirements.in + pip-compile を紹介
This post described the default Python’s dependency management system and how it breaks automated version upgrades.
We continued to describe the pip-compile alternative, which solves the problem.
Just enough dependency management in Python
仮想環境
There’s only a single runtime for a system, and dependencies are shared across all projects on this system.
pip freeze > requirements.txt
Dependencies and transitive dependencies
direct dependencies
transitive dependencies(他動の)
A transitive dependency is a dependency that’s not required by the project directly but by one of the project’s dependencies, or a dependency’s dependency, all the way down.
direct dependenciesのdependencies
The installed version is the latest compatible version found by pip at install time.
ライブラリのsetup.pyから互換なバージョンを知る
(感想:pip freezeして再現することは意味がありそう)
Pip and transitive dependencies
direct dependenciesもtransitive dependenciesも記載されたrequirements.txtの問題点
#Dependabot がrequirements.txtを見てtransitive dependencyのアップグレードを提案(最新に追従する挙動で設定) direct dependencyとしてはtransitive dependencyのバージョンが上がるとincompatible
マージしたことでinstallでコケてしまう
(インストール時のバージョンが互換なので、transitive dependencyのバージョンを上げることで互換でなくなることがある)
pip-compile to the rescue
1. One lists their direct dependencies in a requirements.in file, which has the same format as requirements.txt
「direct dependenciesだけをrequirements.inに書く」
「形式はrequirements.txtと同じ」
2. The pip-compile tool generates a requirements.txt from the requirements.in.
pip-compile requirements.inでrequirements.txtが生成される
そのためrequirements.txtはバージョン管理不要
Since pip-compile generates the file, you shouldn’t save it in the VCS
requirements.inのみバージョン管理
理解:Dependabotはrequirements.inを見る(要出典)ので、問題点は解決
transitive dependenciesをdependabotは見ない
そのため、direct dependencyがincompatibleなバージョンのtransitive dependencyにアップグレードするプルリクエストは作られない
It’s similar to a Maven’s POM, with a different format.